package com.heima.wemedia.service.impl;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.cjq.core.MinioServer;
import com.heima.model.common.dtos.PageResponseResult;
import com.heima.model.common.dtos.ResponseResult;
import com.heima.model.common.enums.AppHttpCodeEnum;
import com.heima.model.wemedia.dtos.WmMaterialDto;
import com.heima.model.wemedia.pojos.WmMaterial;
import com.heima.utils.common.WmThreadLocalUtil;
import com.heima.wemedia.mapper.WmMaterialMapper;
import com.heima.wemedia.service.WmMaterialService;
import io.minio.MinioClient;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.data.redis.RedisProperties;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.util.Date;

@Service
@Slf4j
public class WmMaterialServiceImpl extends ServiceImpl<WmMaterialMapper, WmMaterial> implements WmMaterialService {

    @Autowired
    private MinioServer minioServer;
    @Override
    public ResponseResult uploadPic(MultipartFile file) {
        if (file==null || file.getSize()==0){
            return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
        }
        String url = minioServer.uploadFile("leadnews", file);
        log.info("上传文件到MinIO中,URL:{}",url);
        WmMaterial wmMaterial = new WmMaterial();
        wmMaterial.setUserId(WmThreadLocalUtil.getUser().getId());
        wmMaterial.setUrl(url);
        wmMaterial.setType((short)0);
        wmMaterial.setIsCollection((short) 0);
        wmMaterial.setCreatedTime(new Date());
        save(wmMaterial);
        return ResponseResult.okResult(wmMaterial);
    }

    /**
     * 查询用户素材列表接口
     *
     * @param wmMaterialDto 请求参数对象，包含分页信息和收藏状态过滤条件
     * @return ResponseResult 返回分页查询结果，包含素材列表数据和分页元信息
     */
    @Override
    public ResponseResult listPic(WmMaterialDto wmMaterialDto) {
        // 验证请求参数合法性（分页参数非空校验等）
        wmMaterialDto.checkParam();

        /**
         * 构建动态查询条件：
         * 1. 固定查询当前用户素材（user_id匹配）
         * 2. 根据isCollection参数值动态添加收藏状态过滤条件
         * 3. 按素材创建时间升序排序
         * 4. 执行分页查询（page为当前页码，size为每页条目数）
         */
        Page<WmMaterial> page = lambdaQuery()
                .eq(WmMaterial::getUserId, WmThreadLocalUtil.getUser().getId())
                .eq(wmMaterialDto.getIsCollection() != null && wmMaterialDto.getIsCollection() == 1,
                        WmMaterial::getIsCollection,
                        wmMaterialDto.getIsCollection())
                .orderByAsc(WmMaterial::getCreatedTime)
                .page(new Page<>(wmMaterialDto.getPage(), wmMaterialDto.getSize()));

        /**
         * 构建分页响应结果：
         * 1. 创建带分页元信息的响应对象（当前页码、每页条目数、总条目数）
         * 2. 将分页查询结果封装到响应数据体中
         */
        ResponseResult responseResult = new PageResponseResult(wmMaterialDto.getPage(), wmMaterialDto.getSize(), (int)page.getTotal());
        responseResult.setData(page.getRecords());
        return responseResult;
    }

}
